<?php

/** Classe abstrata que representa uma modalidade */
class Modalidade {

	const TYPE = 'modalidade';

	var $id;
	var $nome;
	var $tipo;
	var $proreitoria;
	var $valor;

	var $type = Modalidade::TYPE;

	/** Delega a subclasse a funcao de validar um aluno e sua bolsa */
	public function validate($aluno, $bolsa) {
		$tipo->validate($aluno, $bolsa);
	}

}

/** Classe que representa um tipo de modalidade */
abstract class TipoModalidade {
	
	const TYPE 					= 'tipo';
	
	const Acumulavel		= 'acumulavel';
	const NaoAcumulavel	= 'nao_acumulavel';
	const Beneficio			= 'beneficio';
	
	var $id;
	var $nome;
	var $restricoes;
	
	var $type = TipoModalidade::TYPE;

	/** Delega a subclasse a funcao de validar um aluno e sua bolsa */
	abstract public function validate($aluno);
}

/** Classe concreta que representa uma modalidade acumulativa de bolsa */
class Acumulativa extends TipoModalidade {

	public function __construct() {
		$this->nome = "Acumulável";
	}

	/** Verifica se a modalidade de uma bolsa esta entre as restricoes */
	public function validate($aluno) {
		return !(sizeof($aluno->bolsas) > 0);
	}

}

/** Classe concreta que representa uma modalidade nao acumulativa de bolsa */
class NaoAcumulativa extends TipoModalidade {

	public function __construct() {
		$this->nome = "Não Acumulável";
	}

	/** valida um vinculo */
	public function validate($aluno) {
		return !(sizeof($aluno->bolsas) > 0);
	}

}

/** Classe concreta que compreende um beneficio, que pode ser acumulado. */
class Beneficio extends TipoModalidade {

	public function __construct() {
		$this->nome = "Benefício";
	}

	public function validate($aluno) {
		return !(sizeof($aluno->bolsas) > 0);
	}

}

/* Outras Classes */

